package liste;

import java.io.Serializable;

import person.Mitarbeiter;
import projekt.Projekt;

public class ProjektListe extends Liste<Projekt> implements Listen, Serializable {


	/**
	 * 
	 */
	private static final long serialVersionUID = 4683615827767932720L;

	public boolean loescheProjekt(long id) {
		if (existiertElement(id)) {
			Knoten<Projekt> help = head;
			// Ein Element vor Element mit Projekt p in der Liste suchen
			while (help.getNaechster().getElement().getId() != id
					&& help.getNaechster().getNaechster() != null) { // wenn Projekt
															// gefunden
				help = help.getNaechster();
			}
			// if (help.getNext().getNext() != null) {
			help.setNaechster(help.getNaechster().getNaechster());
			this.anzahl--;
			return true;
			// }
		} else {
			return false;
		}
	}

	public boolean vorneLoeschen() {
		this.head.setNaechster(head.getNaechster().getNaechster());
		return true;
	}

	public Projekt getProjekt(long id){ // NULL Pointer Exception muss abgefangen werden!
		Knoten<Projekt> help = this.head;
		while (help.getNaechster() != null) {
			if (help.getNaechster().getElement().getId() == id)
				return help.getNaechster().getElement();
			help = help.getNaechster();
		}
		return null;
	}

	@Override
	 public void sortiere() {
		 Projekt[] pj = this.toArray();
	     qSort(pj, 0, pj.length-1);
	     this.setHead(toListe(pj).getHead());
	      
	   }
	
	public boolean ersetzeProjekt(Projekt projekt){
		long perno = projekt.getId();
		Knoten<Projekt> pr = this.head;
		do {
			if (pr.getNaechster().getElement().getId() == perno) {
				pr.getNaechster().setElement(projekt);
				return true;
			}
			pr = pr.getNaechster();
		} while (pr.getNaechster() != null);
		return false;
	}
	    
//-------------------------------Hilfsfunktionen--------------------------------------------------
	
	
	public static ProjektListe toListe(Projekt[] pj){
		ProjektListe erg = new ProjektListe();
		for(int i = pj.length-1; i>=0; i-- ){
			erg.vorneAnfuegen(pj[i]);
		}
		
		return erg;
	}

	   public static void qSort(Projekt[] pj, int links, int rechts) {
		      if (links < rechts) {
		         int i = partition(pj,links,rechts);
		         qSort(pj,links,i-1);
		         qSort(pj,i+1,rechts);
		      }
		   }
		    
		   public static int partition(Projekt[] pj, int links, int rechts) {
		      Projekt pivot;
			int i, j;
			Projekt help;
		      pivot = pj[rechts];               
		      i     = links;
		      j     = rechts-1;
		      while(i<=j) {
		         if (pj[i].compareTo(pivot)>0) {     
		            // tausche x[i] und x[j]
		            help = pj[i]; 
		            pj[i] = pj[j]; 
		            pj[j] = help;                             
		            j--;
		         } else i++;            
		      }
		      // tausche x[i] und x[rechts]
		      help      = pj[i];
		      pj[i]      = pj[rechts];
		      pj[rechts] = help;
		        
		      return i;
		   }
	public Projekt[] toArray(){
		
		Projekt[] erg = new Projekt[this.getAnzahl()];
		Knoten<Projekt> hilfe = new Knoten<Projekt>(null,null);
		hilfe.setNaechster(this.getHead().getNaechster());
		for(int i = 0;i<this.getAnzahl();i++){
			erg[i] = hilfe.getNaechster().getElement();
			hilfe.setNaechster(hilfe.getNaechster().getNaechster());	
		}
		
		return erg;
	}

	@Override
	public boolean existiertElement(long id) {
		Knoten<Projekt> mi = this.head;
		if(this.getAnzahl()==0){
			return false;
		}
		do {
			if (mi.getNaechster().getElement().getId() == id) {
				return true;
			}
			mi = mi.getNaechster();
		} while (mi.getNaechster() != null);
		return false;
	}
}
